home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 1.0 beta / flock-1.0RC3.en-US.win32.exe / flock / components / flockHousekeeper.js < prev    next >
Text File  |  2007-10-18  |  6KB  |  211 lines

  1. // vim: tabstop=2 softtabstop=2 shiftwidth=2 expandtab
  2. //
  3. // BEGIN FLOCK GPL
  4. // 
  5. // Copyright Flock Inc. 2005-2007
  6. // http://flock.com
  7. // 
  8. // This file may be used under the terms of of the
  9. // GNU General Public License Version 2 or later (the "GPL"),
  10. // http://www.gnu.org/licenses/gpl.html
  11. // 
  12. // Software distributed under the License is distributed on an "AS IS" basis,
  13. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  14. // for the specific language governing rights and limitations under the
  15. // License.
  16. // 
  17. // END FLOCK GPL
  18. //
  19.  
  20. const HK_CONTRACTID = '@flock.com/housekeeper;1';
  21. const HK_CLASSID    = Components.ID('{e8415493-ab17-463e-837d-8516fce89364}');
  22. const HK_CLASSNAME  = 'Flock Housekeeper';
  23.  
  24.  
  25. const CATEGORY_HOUSEKEEPING = 'flockHousekeeping';
  26.  
  27. const PREF_HK_INTERVAL      = 'flock.housekeeping.interval';
  28. const DEFAULT_HK_INTERVAL   = 28800;
  29.  
  30.  
  31. const Cc = Components.classes;
  32. const Ci = Components.interfaces;
  33. const Cr = Components.results;
  34.  
  35.  
  36. function getObserverService() {
  37.   return Cc['@mozilla.org/observer-service;1']
  38.     .getService(Ci.nsIObserverService);
  39. }
  40.  
  41. function getIntPref(prefName, defaultValue) {
  42.   try {
  43.     var prefs = Cc['@mozilla.org/preferences-service;1']
  44.       .getService(Ci.nsIPrefBranch);
  45.     return prefs.getIntPref(prefName);
  46.   }
  47.   catch (e) {
  48.     return defaultValue;
  49.   }
  50. }
  51.  
  52.  
  53. function Housekeeper() {
  54.   var obs = getObserverService();
  55.  
  56.   obs.addObserver(this, 'flock-data-ready', false);
  57.   obs.addObserver(this, 'xpcom-shutdown', false);
  58. }
  59.  
  60. Housekeeper.prototype = {
  61.   _start: function HK__start() {
  62.     this._logger = Cc['@flock.com/logger;1'].createInstance(Ci.flockILogger);
  63.     this._logger.init('housekeeper');
  64.     this._logger.info('starting up...');
  65.  
  66.     var tm = Cc['@mozilla.org/updates/timer-manager;1']
  67.       .getService(Ci.nsIUpdateTimerManager);
  68.     var interval = getIntPref(PREF_HK_INTERVAL, DEFAULT_HK_INTERVAL);
  69.     tm.registerTimer('background-housekeeping-timer', this, interval);
  70.   },
  71.  
  72.   _shutdown: function HK__shutdown() {
  73.   },
  74.  
  75.   observe: function HK_observe(subject, topic, state) {
  76.     var obs = getObserverService();
  77.  
  78.     switch (topic) {
  79.       case 'flock-data-ready':
  80.         obs.removeObserver(this, 'flock-data-ready');
  81.         this._start();
  82.         break;
  83.  
  84.       case 'xpcom-shutdown':
  85.         obs.removeObserver(this, 'xpcom-shutdown');
  86.         this._shutdown();
  87.         break;
  88.     }
  89.   },
  90.  
  91.   notify: function HK_notify(timer) {
  92.     this.doHousekeeping();
  93.   },
  94.  
  95.   doHousekeeping: function HK_doHousekeeping() {
  96.     var catman = Cc['@mozilla.org/categorymanager;1']
  97.       .getService(Ci.nsICategoryManager);
  98.  
  99.     var entries = catman.enumerateCategory(CATEGORY_HOUSEKEEPING);
  100.     while (entries.hasMoreElements()) {
  101.       try {
  102.         var entry = entries.getNext().QueryInterface(Ci.nsISupportsCString).data;
  103.         var contractID = catman.getCategoryEntry(CATEGORY_HOUSEKEEPING, entry);
  104.  
  105.         this._logger.info('Running housekeeping: ' + contractID);
  106.         var service = Cc[contractID].getService(Ci.flockIHousekeeping);
  107.         service.runHousekeeping();
  108.       }
  109.       catch (e) {
  110.         this._logger.error('Error running housekeeping: ' + e);
  111.       }
  112.     }
  113.   },
  114.  
  115.   getInterfaces: function HK_getInterfaces(countRef) {
  116.     var interfaces = [Ci.flockIHousekeeper, Ci.nsITimerCallback,
  117.                       Ci.nsIObserver, Ci.nsIClassInfo, Ci.nsISupports];
  118.     countRef.value = interfaces.length;
  119.     return interfaces;
  120.   },
  121.   getHelperForLanguage: function HK_getHelperForLanguage(language) {
  122.     return null;
  123.   },
  124.   contractID: HK_CONTRACTID,
  125.   classDescription: HK_CLASSNAME,
  126.   classID: HK_CLASSID,
  127.   implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
  128.   flags: Ci.nsIClassInfo.SINGLETON,
  129.  
  130.   QueryInterface: function HK_QueryInterface(iid) {
  131.     if (iid.equals(Ci.flockIHousekeeper) ||
  132.         iid.equals(Ci.nsITimerCallback) ||
  133.         iid.equals(Ci.nsIObserver) ||
  134.         iid.equals(Ci.nsIClassInfo) ||
  135.         iid.equals(Ci.nsISupports))
  136.       return this;
  137.     throw Cr.NS_ERROR_NO_INTERFACE;
  138.   }
  139. }
  140.  
  141.  
  142. function GenericComponentFactory(ctor) {
  143.   this._ctor = ctor;
  144. }
  145.  
  146. GenericComponentFactory.prototype = {
  147.  
  148.   _ctor: null,
  149.  
  150.   // nsIFactory
  151.   createInstance: function(outer, iid) {
  152.     if (outer != null)
  153.       throw Cr.NS_ERROR_NO_AGGREGATION;
  154.     return (new this._ctor()).QueryInterface(iid);
  155.   },
  156.  
  157.   // nsISupports
  158.   QueryInterface: function(iid) {
  159.     if (iid.equals(Ci.nsIFactory) ||
  160.         iid.equals(Ci.nsISupports))
  161.       return this;
  162.     throw Cr.NS_ERROR_NO_INTERFACE;
  163.   },
  164. };
  165.  
  166. var Module = {
  167.   QueryInterface: function(iid) {
  168.     if (iid.equals(Ci.nsIModule) ||
  169.         iid.equals(Ci.nsISupports))
  170.       return this;
  171.  
  172.     throw Cr.NS_ERROR_NO_INTERFACE;
  173.   },
  174.  
  175.   getClassObject: function(cm, cid, iid) {
  176.     if (!iid.equals(Ci.nsIFactory))
  177.       throw Cr.NS_ERROR_NOT_IMPLEMENTED;
  178.  
  179.     if (cid.equals(HK_CLASSID))
  180.       return new GenericComponentFactory(Housekeeper)
  181.  
  182.     throw Cr.NS_ERROR_NO_INTERFACE;
  183.   },
  184.  
  185.   registerSelf: function(cm, file, location, type) {
  186.     var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
  187.     cr.registerFactoryLocation(HK_CLASSID, HK_CLASSNAME, HK_CONTRACTID,
  188.                                file, location, type);
  189.  
  190.     var catman = Cc['@mozilla.org/categorymanager;1']
  191.       .getService(Ci.nsICategoryManager);
  192.     catman.addCategoryEntry('flock-startup', HK_CLASSNAME,
  193.                             'service,' + HK_CONTRACTID,
  194.                             true, true);
  195.   },
  196.  
  197.   unregisterSelf: function(cm, location, type) {
  198.     var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
  199.     cr.unregisterFactoryLocation(HK_CLASSID, location);
  200.   },
  201.  
  202.   canUnload: function(cm) {
  203.     return true;
  204.   },
  205. };
  206.  
  207. function NSGetModule(compMgr, fileSpec)
  208. {
  209.   return Module;
  210. }
  211.